home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / win / X11 / dialogs.c next >
C/C++ Source or Header  |  1993-01-22  |  10KB  |  302 lines

  1. /*
  2.  * Copyright 1991 University of Wisconsin-Madison
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and its
  5.  * documentation for any purpose is hereby granted without fee, provided that
  6.  * the above copyright notice appear in all copies and that both that
  7.  * copyright notice and this permission notice appear in supporting
  8.  * documentation, and that the name of the University of Wisconsin-Madison not
  9.  * be used in advertising or publicity pertaining to distribution of the
  10.  * software without specific, written prior permission.  The University of
  11.  * Wisconsin-Madison makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without express or
  13.  * implied warranty.
  14.  *
  15.  * THE UNIVERSITY OF WISCONSIN-MADISON DISCLAIMS ALL WARRANTIES WITH REGARD TO
  16.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17.  * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF WISCONSIN-MADISON BE LIABLE FOR
  18.  * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  19.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  20.  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  21.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  *
  23.  * Author:  Tim Theisen             Department of Computer Sciences
  24.  *          tim@cs.wisc.edu         University of Wisconsin-Madison
  25.  *          uwvax!tim               1210 West Dayton Street
  26.  *          (608)262-0438           Madison, WI   53706
  27.  *
  28.  *
  29.  * Modified 12/91 by Dean Luick.  Tim graciously donated this piece of code
  30.  * from his program ghostview, an X11 front end for ghostscript.
  31.  *
  32.  *    + Make the cancel button optional.
  33.  *    + Put an #ifdef SPECIAL_CMAP around code to fix a colormap bug.
  34.  *    We don't need it here.
  35.  *    + Add the function positionpopup() from another part of ghostview
  36.  *    to this code.
  37.  */
  38.  
  39. #include <X11/Intrinsic.h>
  40. #include <X11/StringDefs.h>
  41. #include <X11/Xos.h>
  42. #include <X11/Xaw/Cardinals.h>
  43. #include <X11/Xaw/Form.h>
  44. #include <X11/Xaw/Label.h>
  45. #include <X11/Xaw/AsciiText.h>
  46. #include <X11/Xaw/Command.h>
  47.  
  48. #include "config.h"    /* #define for const for non __STDC__ compilers */
  49.  
  50. /* ":" added to both translations below to allow limited redefining of
  51.  * keysyms before testing for keysym values -- dlc */
  52. static const char okay_accelerators[] =
  53.     "#override\n\
  54.      :<Key>Return: set() notify() unset()\n";
  55.  
  56. static const char cancel_accelerators[] =
  57.     "#override\n\
  58.      :<Key>Escape: set() notify() unset()\n\
  59.      :<Ctrl>[: set() notify() unset()\n";    /* for keyboards w/o an ESC */
  60.  
  61.  
  62. /* Create a dialog widget.  It is just a form widget with
  63.  *    a label prompt
  64.  *    a text response
  65.  *    an okay button
  66.  *    an optional cancel button
  67.  */
  68. Widget
  69. CreateDialog(parent, name, okay_callback, cancel_callback)
  70.     Widget parent;
  71.     String name;
  72.     XtCallbackProc okay_callback;
  73.     XtCallbackProc cancel_callback;
  74. {
  75.     Widget form, prompt, response, okay, cancel;
  76.     Arg args[20];
  77.     Cardinal num_args;
  78.  
  79.                             num_args = 0;
  80. #ifdef SPECIAL_CMAP
  81.     if (special_cmap) {
  82.     XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  83.     }
  84. #endif
  85.     form = XtCreateManagedWidget(name, formWidgetClass, parent, args, num_args);
  86.  
  87.                             num_args = 0;
  88. #ifdef SPECIAL_CMAP
  89.     if (special_cmap) {
  90.     XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  91.     XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  92.     }
  93. #endif
  94.     XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  95.     XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  96.     XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  97.     XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  98.     XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  99.     XtSetArg(args[num_args], XtNborderWidth, 0);    num_args++;
  100.     prompt = XtCreateManagedWidget("prompt", labelWidgetClass,
  101.                    form, args, num_args);
  102.  
  103.                             num_args = 0;
  104. #ifdef SPECIAL_CMAP
  105.     if (special_cmap) {
  106.     XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  107.     XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  108.     }
  109. #endif
  110.     XtSetArg(args[num_args], XtNfromVert, prompt);    num_args++;
  111.     XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  112.     XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  113.     XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  114.     XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  115.     XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  116.     XtSetArg(args[num_args], XtNeditType, XawtextEdit);    num_args++;
  117.     XtSetArg(args[num_args], XtNresize, XawtextResizeWidth);    num_args++;
  118.     XtSetArg(args[num_args], XtNstring, "");        num_args++;
  119.     response = XtCreateManagedWidget("response", asciiTextWidgetClass,
  120.                      form, args, num_args);
  121.  
  122.                             num_args = 0;
  123. #ifdef SPECIAL_CMAP
  124.     if (special_cmap) {
  125.     XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  126.     XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  127.     }
  128. #endif
  129.     XtSetArg(args[num_args], XtNfromVert, response);    num_args++;
  130.     XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  131.     XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  132.     XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  133.     XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  134.     XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  135.     XtSetArg(args[num_args], XtNaccelerators,
  136.          XtParseAcceleratorTable(okay_accelerators));    num_args++;
  137.     okay = XtCreateManagedWidget("okay", commandWidgetClass,
  138.                  form, args, num_args);
  139.     XtAddCallback(okay, XtNcallback, okay_callback, form);
  140.  
  141.     /* Only create cancel button if there is a callback for it. */
  142.     if (cancel_callback) {
  143.                                 num_args = 0;
  144. #ifdef SPECIAL_CMAP
  145.     if (special_cmap) {
  146.         XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  147.         XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  148.     }
  149. #endif
  150.     XtSetArg(args[num_args], XtNfromVert, response);    num_args++;
  151.     XtSetArg(args[num_args], XtNfromHoriz, okay);        num_args++;
  152.     XtSetArg(args[num_args], XtNtop, XtChainTop);        num_args++;
  153.     XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  154.     XtSetArg(args[num_args], XtNleft, XtChainLeft);        num_args++;
  155.     XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  156.     XtSetArg(args[num_args], XtNresizable, True);        num_args++;
  157.     XtSetArg(args[num_args], XtNaccelerators,
  158.          XtParseAcceleratorTable(cancel_accelerators));    num_args++;
  159.     cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
  160.                        form, args, num_args);
  161.     XtAddCallback(cancel, XtNcallback, cancel_callback, form);
  162.     XtInstallAccelerators(response, cancel);
  163.     }
  164.  
  165.     XtInstallAccelerators(response, okay);
  166.     XtSetKeyboardFocus(form, response);
  167.  
  168.     return form;
  169. }
  170.  
  171. #if 0
  172. /* get the prompt from the dialog box.  Used a startup time to
  173.  * save away the initial prompt */
  174. String
  175. GetDialogPrompt(w)
  176.     Widget w;
  177. {
  178.     Arg args[1];
  179.     Widget label;
  180.     String s;
  181.  
  182.     label = XtNameToWidget(w, "prompt");
  183.     XtSetArg(args[0], XtNlabel, &s);
  184.     XtGetValues(label, args, ONE);
  185.     return XtNewString(s);
  186. }
  187. #endif
  188.  
  189. /* set the prompt.  This is used to put error information in the prompt */
  190. void
  191. SetDialogPrompt(w, newprompt)
  192.     Widget w;
  193.     String newprompt;
  194. {
  195.     Arg args[1];
  196.     Widget label;
  197.  
  198.     label = XtNameToWidget(w, "prompt");
  199.     XtSetArg(args[0], XtNlabel, newprompt);
  200.     XtSetValues(label, args, ONE);
  201. }
  202.  
  203. /* get what the user typed */
  204. String
  205. GetDialogResponse(w)
  206.     Widget w;
  207. {
  208.     Arg args[1];
  209.     Widget response;
  210.     String s;
  211.  
  212.     response = XtNameToWidget(w, "response");
  213.     XtSetArg(args[0], XtNstring, &s);
  214.     XtGetValues(response, args, ONE);
  215.     return XtNewString(s);
  216. }
  217.  
  218. /* set the default reponse */
  219. void
  220. SetDialogResponse(w, s)
  221.     Widget w;
  222.     String s;
  223. {
  224.     Arg args[3];
  225.     Widget response;
  226.     XFontStruct *font;
  227.     Dimension width, leftMargin, rightMargin;
  228.  
  229.     response = XtNameToWidget(w, "response");
  230.     XtSetArg(args[0], XtNfont, &font);
  231.     XtSetArg(args[1], XtNleftMargin, &leftMargin);
  232.     XtSetArg(args[2], XtNrightMargin, &rightMargin);
  233.     XtGetValues(response, args, THREE);
  234.     width = font->max_bounds.width * strlen(s) + leftMargin + rightMargin;
  235.  
  236.     XtSetArg(args[0], XtNstring, s);
  237.     XtSetArg(args[1], XtNwidth, width);
  238.     XtSetValues(response, args, TWO);
  239.     XawTextSetInsertionPoint(response, strlen(s));
  240. }
  241.  
  242. #if 0
  243. /* clear the response */
  244. void
  245. ClearDialogResponse(w)
  246.     Widget w;
  247. {
  248.     Arg args[2];
  249.     Widget response;
  250.  
  251.     response = XtNameToWidget(w, "response");
  252.     XtSetArg(args[0], XtNstring, "");
  253.     XtSetArg(args[1], XtNwidth, 100);
  254.     XtSetValues(response, args, TWO);
  255. }
  256. #endif
  257.  
  258.  
  259. /* Not a part of the original dialogs.c from ghostview --------------------- */
  260.  
  261. /* position popup window under the cursor */
  262. void
  263. positionpopup(w)
  264.     Widget w;
  265. {
  266.     Arg args[3];
  267.     Cardinal num_args;
  268.     Dimension width, height, b_width;
  269.     int x, y, max_x, max_y;
  270.     Window root, child;
  271.     int dummyx, dummyy;
  272.     unsigned int dummymask;
  273.     extern Widget toplevel;
  274.  
  275.     /* following line deals with a race condition w/brain-damaged WM's -dlc */
  276.     XtUnrealizeWidget(w);
  277.  
  278.     XQueryPointer(XtDisplay(toplevel), XtWindow(toplevel), &root, &child,
  279.           &x, &y, &dummyx, &dummyy, &dummymask);
  280.     num_args = 0;
  281.     XtSetArg(args[num_args], XtNwidth, &width); num_args++;
  282.     XtSetArg(args[num_args], XtNheight, &height); num_args++;
  283.     XtSetArg(args[num_args], XtNborderWidth, &b_width); num_args++;
  284.     XtGetValues(w, args, num_args);
  285.  
  286.     width += 2 * b_width;
  287.     height += 2 * b_width;
  288.  
  289.     x -= ( (Position) width/2 );
  290.     if (x < 0) x = 0;
  291.     if ( x > (max_x = (Position) (XtScreen(w)->width - width)) ) x = max_x;
  292.  
  293.     y -= ( (Position) height/2 );
  294.     if (y < 0) y = 0;
  295.     if ( y > (max_y = (Position) (XtScreen(w)->height - height)) ) y = max_y;
  296.  
  297.     num_args = 0;
  298.     XtSetArg(args[num_args], XtNx, x); num_args++;
  299.     XtSetArg(args[num_args], XtNy, y); num_args++;
  300.     XtSetValues(w, args, num_args);
  301. }
  302.